package com.bestcem.xm.user.dao.mapper;

import com.bestcem.xm.user.entity.mysql.Organization;
import com.bestcem.xm.user.entity.pojo.ListOrgByPageDO;
import com.bestcem.xm.user.entity.pojo.ListOrgsByFilterDO;
import com.bestcem.xm.user.entity.pojo.OrganizationDO;
import com.bestcem.xm.user.grpc.service.param.ListOrgsByPagingParam;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Set;

@Mapper
public interface OrganizationMapper {

    /**
     * 根据主键删除
     *
     * @param orgId
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:32
     */
    int deleteByPrimaryKey(String orgId);

    /**
     * 插入
     *
     * @param organization
     * @return java.lang.String
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:32
     */
    int insertSelective(Organization organization);

    /**
     * 根据主键查询
     *
     * @param orgId
     * @return java.lang.String
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:32
     */
    Organization selectByPrimaryKey(String orgId);

    /**
     * 根据主键部分更新
     *
     * @param organization
     * @return java.lang.String
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:32
     */
    int updateByPrimaryKeySelective(Organization organization);

    /**
     * 根据主键全量更新
     *
     * @param organization
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:32
     */
    int updateByPrimaryKey(Organization organization);

    /**
     * 根据租户id和状态查询
     *
     * @param orgId
     * @param status
     * @return com.bestcem.xm.user.entity.pojo.OrganizationDO
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:38
     */
    Organization selectByOrgIdAndStatus(@Param("orgId") String orgId, @Param("status") Integer status);

    /**
     * 根据公司代号查询公司基础信息
     *
     * @param codes 公司代号
     * @return com.bestcem.xm.user.entity.mysql.Organization
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 14:25
     */
    List<Organization> listByOrgCodes(@Param("codes") List<String> codes);

    /**
     * 根据公司id列表和状态查询公司信息列表
     *
     * @param orgIds 公司id列表
     * @param status 状态
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.Organization>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/08 11:35
     */
    List<Organization> selectByIdsAndStatus(@Param("orgIds") List<String> orgIds, @Param("status") Integer status);

    /**
     * 根据公司id列表查询公司code列表
     *
     * @param orgIds 公司id列表
     * @return java.util.List<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/08 17:03
     */
    List<String> selectOrgCodesByIds(@Param("orgIds") List<String> orgIds);

    /**
     * 根据公司id批量获取公司信息
     *
     * @param orgIdSet 公司id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/11 13:45
     */
    List<Organization> selectByOrgIds(@Param("orgIdSet") Set<String> orgIdSet);

    /**
     * 获取套餐过期的公司
     *
     * @param packType      套餐类型
     * @param orgStatusList 状态列表
     * @param now           数据库当前时间
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.OrganizationDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    List<Organization> getExpirePackOrg(@Param("packType") String packType, @Param("orgStatusList") List<Integer> orgStatusList, @Param("now") Date now);

    /**
     * 根据今日日期查询正式套餐还有30天就过期的公司
     *
     * @param time   当前时间
     * @param status
     * @return List<OrganizationDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/03/10 11:00
     */
    List<Organization> getByfomalExpiryTime(@Param("time") LocalDateTime time, @Param("orgStatusList") List<Integer> status);

    /**
     * 获取所有organization信息
     *
     * @param
     * @return 公司信息
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/01 17:30
     */
    List<Organization> getAllOrg();

    /**
     * 可选参数查询
     *
     * @param organization
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.Organization>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/21 20:46
     */
    List<Organization> selectBySelective(Organization organization);

    /**
     * 更新停用且套餐未过期的公司
     *
     * @param inactivated
     * @param expired
     * @param expireTime
     * @param yesterday
     * @param updateTime
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    Integer updatePackGteTodayOrg(@Param("inactivated") Integer inactivated, @Param("expired") Integer expired, @Param("expireTime") Date expireTime, @Param("yesterday") Date yesterday, @Param("updateTime") Date updateTime);

    /**
     * 更新停用且套餐过期的公司
     *
     * @param inactivated
     * @param expired
     * @param expireTime
     * @param updateTime
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    Integer updatePackLteTodayOrg(@Param("inactivated") Integer inactivated, @Param("expired") Integer expired, @Param("expireTime") Date expireTime, @Param("updateTime") Date updateTime);

    /**
     * 更新未完善信息的公司
     *
     * @param complete
     * @param noComplete
     * @param updateTime
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    Integer updateCompleteFlag(@Param("complete") Integer complete, @Param("noComplete") Integer noComplete, @Param("updateTime") Date updateTime);

    /**
     * 租户管理分页获得公司信息
     *
     * @param pageDO 检索条件
     * @param org    公司信息
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.OrganizationDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/16 21:07
     */
    List<Organization> listOrganizationsByPage(@Param("pageDO") ListOrgByPageDO pageDO, @Param("org") OrganizationDO org);

    /**
     * 租户管理分页获得公司信息数量统计
     *
     * @param pageDO 检索条件
     * @param org    公司信息
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/17 11:42
     */
    Integer listOrganizationsByPageCount(@Param("pageDO") ListOrgByPageDO pageDO, @Param("org") OrganizationDO org);


    /**
     * 根据package_ids查询租户id列表
     *
     * @param packageIdsList 套餐id列表
     * @return java.util.List<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/17 15:30
     */
    List<String> selectOrgIdsByPackageIds(List<String> packageIdsList);

    /**
     * 根据搜索条件查询公司列表
     *
     * @param organizationDO 组织条件DTO
     * @param statuses     组织状态
     * @param search       公司编码，公司名称模糊查询条件
     * @param tableFields  限定返回字段
     * @param limit        限定返回行数
     * @return 组织条件DO
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 16:04 2022/6/28
     */
    List<Organization> listOrganizations(@Param("org") OrganizationDO organizationDO,
                                         @Param("statuses") List<Integer> statuses, @Param("search") String search,
                                         @Param("tableFields") String tableFields, @Param("limit") Integer limit);

    /**
     * 根据筛选条件筛选公司信息
     *
     * @param pageDO
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.OrganizationDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 16:24
     */
    List<Organization> listOrgsByFilter(@Param("pageDO") ListOrgsByFilterDO pageDO);

    /**
     * 根据筛选条件筛选公司信息总数
     *
     * @param pageDO
     * @return java.lang.Long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 16:26
     */
    Long listOrgsByFilterCount(@Param("pageDO") ListOrgsByFilterDO pageDO);

    /**
     * 查询inner_flag为空的租户id列表
     *
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.Organization>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:18
     */
    List<Organization> selectByInnerFlagIsNull();

    /**
     * 将所有inner_flag为空的租户的inner_flag更新为false
     *
     * @param updateTime 更新时间
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:09
     */
    void updateInnerFlagIsNullToFalse(Date updateTime);

    /**
     * 根据orgId列表更新innerFlag字段
     *
     * @param orgIds     租户id
     * @param innerFlag  内部用户标识
     * @param updateTime 更新时间
     * @return void
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:36
     */
    void updateInnerFlagByOrgIds(@Param("orgIds") List<String> orgIds, @Param("innerFlag") Integer innerFlag, @Param("updateTime") Date updateTime);


    /**
     * 根据 orgId 更新钱包id
     *
     * @param orgId    租户id
     * @param walletId 钱包id
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/8/1 15:07
     */
    int updateCorpWalletByOrgId(@Param("orgId") String orgId, @Param("walletId") String walletId);

    /**
     * 根据 code 统计数量
     *
     * @param code
     * @return int
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/8/4 13:57
     */
    int countByCode(String code);

    /**
     * 查询所有租户数量
     *
     * @return 租户数量
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 11:39 2022/7/25
     */
    Integer count();

    /**
     * 分页查询租户列表
     *
     * @param limit  limit
     * @param offset offset
     * @return 租户列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 11:39 2022/7/25
     */
    List<Organization> listByPaging(Integer limit, Integer offset);

    /**
     * 总数查询
     *
     * @param organizationDO
     * @param statuses
     * @param search
     * @return java.lang.String
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:32
     */
    Integer count(OrganizationDO organizationDO, List<Integer> statuses, String search);

    /**
     * 总数查询
     *
     * @param organizationDO
     * @param param
     * @param limit
     * @param offset
     * @return java.lang.String
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:32
     */
    Integer baseCount(@Param("org") OrganizationDO organizationDO, @Param("param") ListOrgsByPagingParam param, @Param("limit") Integer limit, @Param("offset") Integer offset);

    /**
     * 分页查询
     *
     * @param organizationDO
     * @param param
     * @param limit
     * @param offset
     * @return java.lang.String
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 15:32
     */
    List<Organization> listOrgsByPaging(@Param("org") OrganizationDO organizationDO, @Param("param") ListOrgsByPagingParam param, @Param("limit") Integer limit, @Param("offset") Integer offset);

    List<String> listIdByOrgInfo(String name, String code);

    Organization findById(String id);

    List<String> listAllIds();
}